package valueObjects {
	import flash.utils.*;
	
	import mx.collections.ArrayCollection;
	import mx.collections.IViewCursor;
	import mx.collections.Sort;
	import mx.collections.SortField;
	
	/**
	 * 购物车
	 */ 
	public class ShoppingCart {
		[Bindable]
		public var items:ArrayCollection = new ArrayCollection(); // 购物车中的所有项目
		
		[Bindable]
		public var total:Number=0; // 总价格
		
		// 使用光标来检索数据
		private var cursor:IViewCursor;
		
		// 将新项目添加到购物车
		public function addItem(item:ShoppingCartItem):void{
			manageAddItem(item);
			calcTotal(); 
		}

		// 从购物车中移除项目
		public function removeItem(prod:Product):void{
			var item:ShoppingCartItem = new ShoppingCartItem(prod);
			var sci:ShoppingCartItem = getItemInCart(item);
			if(sci != null){
				cursor.remove();
			}
			calcTotal();
		}

		// 对购物车中的项目进行排序
		private function sortItems():void{
			var prodSort:Sort = new Sort();
			var sortField:SortField = new SortField("product");
			prodSort.fields = new Array(sortField);
			items.sort = prodSort;
			items.refresh();
		}

		private function manageAddItem(item:ShoppingCartItem):void{
			// 如果item已经在购物车中了，那么更新item的数量；否则将item加入购物车
			if (isItemInCart(item)){ 
				updateItem(item);
			}else{
				items.addItem(item);
			}
		}

		// 判断item是否在购物车当中
		private function isItemInCart(item:ShoppingCartItem):Boolean{
			var sci:ShoppingCartItem = getItemInCart(item);
			if(sci == null){
				return false;
			} else {
				return true;
			}
		}

		// items中获取指定的item
		private function getItemInCart(item:ShoppingCartItem):ShoppingCartItem{
			cursor = items.createCursor();
			sortItems();
			var found:Boolean = cursor.findFirst(item);
			if(found){
				var sci:ShoppingCartItem = cursor.current as ShoppingCartItem;
			}else{
				return null;
			}
			return sci;
		}

		// 更新ShoppingCartItem
		private function updateItem(item:ShoppingCartItem):void{
			var sci:ShoppingCartItem = cursor.current as ShoppingCartItem;
			sci.quantity += item.quantity; // 更新数量
			sci.recalc(); // 重新计算item的价格
		}

		// 计算购物车商品总价格
		private function calcTotal():void{
			this.total = 0;
			for(var i:int=0;i<items.length;i++){
				this.total += items.getItemAt(i).subtotal;
			}
		}
	}
}
